OBS: Para excecutar no Colab, descomentar a célula abaixo

Fundamentação 1: Álgebra Linear

ndarray

Principal estrutura de dados para ML e Redes Neuronais Artificiais

Criação de arrays seguindo uma distribuição qualquer

Exemplos: Distribuição Normal e Uniforme

fig03.png

Exemplo de uso: parâmetro de inicialização de uma rede neuronal.

Vetores = arrays 1D

Somas (vetores)

$\sum_{i=1}^d u_i$ (soma dos elementos em um vetor $\mathbf{u}$ de tamanho $d$)

ATENÇÃO: por convenção, na MXNet escalares são NDArrays com apenas um elemento (usar asscalar é ineficiente)

Matrizes = arrays 2D

Tipicamente representadas por letras maiúsculas ($A$, $B$, $C$)

Somas e médias (matrizes)

Para uma matriz $A$ $m \times n$ matrix ==> $\sum_{i=1}^{m} \sum_{j=1}^{n} a_{ij}$.

$$\mathrm{mean}(\mathbf{u}) = \frac{1}{d} \sum_{i=1}^{d} u_i \text{ and } \mathrm{mean}(A) = \frac{1}{n \cdot m} \sum_{i=1}^{m} \sum_{j=1}^{n} a_{ij}$$

Multiplicação entre Matrizes

Considere duas matrizes: $A \in \mathbb{R}^{n \times k}$ and $B \in \mathbb{R}^{k \times m}$:

$$A=\begin{pmatrix} a_{11} & a_{12} & \cdots & a_{1k} \\ a_{21} & a_{22} & \cdots & a_{2k} \\ \vdots & \vdots & \ddots & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nk} \\ \end{pmatrix},\quad B=\begin{pmatrix} b_{11} & b_{12} & \cdots & b_{1m} \\ b_{21} & b_{22} & \cdots & b_{2m} \\ \vdots & \vdots & \ddots & \vdots \\ b_{k1} & b_{k2} & \cdots & b_{km} \\ \end{pmatrix}$$
$$AB = \begin{pmatrix} \cdots & \mathbf{a}^T_{1} &... \\ \cdots & \mathbf{a}^T_{2} & \cdots \\ & \vdots & \\ \cdots &\mathbf{a}^T_n & \cdots \\ \end{pmatrix} \begin{pmatrix} \vdots & \vdots & & \vdots \\ \mathbf{b}_{1} & \mathbf{b}_{2} & \cdots & \mathbf{b}_{m} \\ \vdots & \vdots & &\vdots\\ \end{pmatrix} = \begin{pmatrix} \mathbf{a}^T_{1} \mathbf{b}_1 & \mathbf{a}^T_{1}\mathbf{b}_2& \cdots & \mathbf{a}^T_{1} \mathbf{b}_m \\ \mathbf{a}^T_{2}\mathbf{b}_1 & \mathbf{a}^T_{2} \mathbf{b}_2 & \cdots & \mathbf{a}^T_{2} \mathbf{b}_m \\ \vdots & \vdots & \ddots &\vdots\\ \mathbf{a}^T_{n} \mathbf{b}_1 & \mathbf{a}^T_{n}\mathbf{b}_2& \cdots& \mathbf{a}^T_{n} \mathbf{b}_m \end{pmatrix} $$

fig05.png

Indexação

fig04.png

Tensor

Generalização do número de eixos!

fig01.png fig02.png

Norma

Devem satisfazer um conjunto de propriedades

  1. $\|\alpha A\| = |\alpha| \|A\|$
  2. $\|A + B\| \leq \|A\| + \|B\|$
  3. $\|A\| \geq 0$
  4. If $\forall {i,j}, a_{ij} = 0$, then $\|A\|=0$

Para calcular a norma $\ell_2$ ....

fig06.png

Para calcular a norma $\ell_1$, calcula-se o valor absoluto de cada valor e os soma.

Fundamentação 2: Probabilidade e Estatística

Aprendizagem de Máquina tem tudo a ver com a realização de previsões.

Chance de um paciente sofrer um ataque cardíaco no próximo ano, dado seu histórico clínico.

Na Aprendizagem por Reforço, queremos que um agente atue de forma inteligente num ambiente. Isto significa que precisamos de pensar na probabilidade de obter uma recompensa elevada sob cada uma das ações disponíveis.

Em Sistemas de Recomendação, queremos estimar a probabilidade de um determinado cliente comprar um determinado livro.

Em todas essas situações, precisamos dos estudos sobre Probabilidade.

Visualizando mais claramente a distribuição Uniforme...

A Distribuição Normal (ou Gaussiana)

Variáveis aleatórias, Probabilidade Conjunta e Independência

Voltando ao exemplo dos lançamentos dos dados, cada dado é uma variável aleatória cujo valor pertence ao espaço amostral $S=\{1,2,3,4,5,6\}$

No caso de dois dados $X$ e $Y$, temos que $P(X, Y) = P(X) · P(Y)$

Mas nem tudo são dados ou moedas....


fig07a.png


Para imagem 1:

$P( Y = "gato")\approx 0,5$

$P( Y = "cachorro") \approx 0,5$

Para imagem 2:

$P( Y = "gato")\approx 0,5$

$P( Y = "cachorro") \approx 0,5$

E agora?


fig07.png


Para imagem 1:

$P( Y = "gato")\approx 1,0$

$P( Y = "cachorro") \approx 0,0$

Para imagem 2:

$P( Y = "gato")\approx 0,0$

$P( Y = "cachorro") \approx 1,0$

O que mudou?

Resolução ( 10×10 , 20×20 , 40×40 , 80×80 , e 160×160 pixels) => diminui a INCERTEZA.

Probabilidade condicional

$P(Y) => P(Y|X)$

Para imagem 1:

$P( Y = "gato" | X = 40x40) \approx 0,8$

$P( Y = "cachorro" | X = 40x40) \approx 0,2$

Teorema de Bayes

Uma das equações mais úteis da Estatística!

Regra da multiplicação:

$P(B, A) = P(B \mid A) P(A)$.

$P(A, B) = P(A \mid B) P(B)$.

Como $P(B, A) = P(A, B)$, então:

$$P(A \mid B) = \frac{P(B \mid A) P(A)}{P(B)}.$$

Exemplo teste COVID

Suponha teste de Covid em um paciente.

Nunca erra se o paciente está com Covid. Erra em 1% se o paciente está sadio.

$D_1$ = resultado do exame ($1$ ou $0$)

$H$ = estado real do paciente ($1$ ou $0$)

Probabilidade condicional $H=1$ $H=0$
$P(D_1 = 1 \mid H)$ 1 0.01
$P(D_1 = 0 \mid H)$ 0 0.99

Qual a probabilidade de um paciente estar com Covid se o exame der positivo, sabendo-se que $0,15\%$ da população tem a doença?

$P(H = 1 \mid D_1 = 1)$ = ?

$P(H=1) = 0.0015$

$$\begin{aligned} &P(D_1 = 1) \\ =& P(D_1=1, H=0) + P(D_1=1, H=1) \\ =& P(D_1=1 \mid H=0) P(H=0) + P(D_1=1 \mid H=1) P(H=1) \\ =& 0.011485. \end{aligned} $$

(OBS: uso de MARGINALIZAÇÃO na segunda linha)

Então,

$$\begin{aligned} &P(H = 1 \mid D_1 = 1)\\ =& \frac{P(D_1=1 \mid H=1) P(H=1)}{P(D_1=1)} \\ =& 0.1306 \end{aligned}.$$

Ou seja, existe apenas 13.06% de chance do paciente ter realmente a doença.

Fundamentação 3: Cálculo diferencial

Na aprendizagem profunda, nós treinamos modelos, atualizando-os sucessivamente para que eles fiquem cada vez melhores à medida que vêem mais e mais dados.

Normalmente, "ficar melhor" significa minimizar uma função de perda, uma pontuação que responde à pergunta "o quão ruim é nosso modelo"?

Em última análise, o que realmente nos interessa é produzir um modelo que funciona bem com os dados que nunca tínhamos visto antes. Mas só podemos ajustar o modelo aos dados que realmente podemos ver.

Assim, podemos decompor a tarefa de ajuste dos modelos em duas questões fundamentais:

i) Otimização: o processo de adequação de nossos modelos aos dados observados;
ii) Generalização: os princípios matemáticos e sacadas que orientam sobre como produzir modelos cuja validade se estende para além do conjunto exato de exemplos de dados usados para treiná-los.

O Cálculo Diferencial nos ajuda com a primeira questão. O cálculo de derivadas é um passo crucial em quase todos os algoritmos de otimização de aprendizagem profunda. Normalmente, escolhemos funções de perda que são diferenciáveis em relação aos parâmetros de nosso modelo.

Em termos simples, isto significa que para cada parâmetro, podemos determinar com que rapidez a perda aumentaria ou diminuiria, quando aumentamos ou diminuimos esse parâmetro por uma quantidade infinitesimamente pequena.

$f: \mathbb{R} \rightarrow \mathbb{R}$,

$f'(x) = \lim_{h \rightarrow 0} \frac{f(x+h) - f(x)}{h},$

A derivada $f'(x)$ é interpretada como a taxa de modificação instantânea de $f(x)$ em relação à $x$. Essa taxa é baseada na variação de $h$ em $x$, que se aproxima de $0$.

Representações equivalentes:

$$f'(x) = y' = \frac{dy}{dx} = \frac{df}{dx} = \frac{d}{dx} f(x) = Df(x) = D_x f(x),$$

Geometricamente, a derivada no ponto $x=a$ de $y = f(x)$ representa a inclinação da reta tangente ao gráfico desta função no ponto $(a,f(a))$.

https://pt.wikipedia.org/wiki/Derivada#/media/Ficheiro:Graph_of_sliding_derivative_line.gif

Idéia intuitiva da derivada

https://pt.wikipedia.org/wiki/Derivada#/media/Ficheiro:What_is_derivative_(animation).gif -->

Gradiente: generalização para vetores

Podemos concatenar derivadas parciais de uma função multivariada com respeito a todas as suas variáveis para obter o vetor gradiente da função.

Suponha que a entrada de uma função $f: \mathbb{R}^n \rightarrow \mathbb{R}$ é um vetor $n$-dimensional $\mathbf{x} = [x_1, x_2, \ldots, x_n]^\top$ e a saída é um escalar. O gradiente da função $f(\mathbf{x})$ em relação à $\mathbf{x}$ é um vetor de $n$ derivadas parciais:

$$\nabla_{\mathbf{x}} f(\mathbf{x}) = \bigg[\frac{\partial f(\mathbf{x})}{\partial x_1}, \frac{\partial f(\mathbf{x})}{\partial x_2}, \ldots, \frac{\partial f(\mathbf{x})}{\partial x_n}\bigg]^\top,$$

onde $\nabla_{\mathbf{x}} f(\mathbf{x})$ é usualmente substituído por $\nabla f(\mathbf{x})$ quando não há ambiguidade.

Exemplo de gradiente para função $f(\mathbf{x}) = f(x_1,x_2) = −(cos^2x_1 + cos^2x_2)^2$

fig10.svg

Para uma função mais simples... $f(\mathbf{x}) = f(x_1,x_2) = x_1^2 + 2x_2^2$

$\nabla_{\mathbf{x}} f(\mathbf{x}) = \bigg[\frac{\partial f(\mathbf{x})}{\partial x_1}, \frac{\partial f(\mathbf{x})}{\partial x_2}\bigg]^\top = [2x_1,4x_2]$

Diferenciação automática com autograd

Modelos complexos de aprendizado profundo utilizam uma ferramenta computacional para agilizar as computações complicadas relacionadas.

1- Constrói Grafo Computacional

2- Passo Forward: avalia o grafo e armazena resultados intermediários

3- Passo Backward: avalia o grafo na ordem inversa (derivadas parciais), eliminando caminhos desnecessários

fig11.png

Anexar gradiente ao x

Aloca memória para armazenar o gradiente, que tem a mesma forma do x.

Também informa ao sistema que precisamos computar seu gradiente.

Forward: calcular y

$$y = 2\mathbf{x}^{\top}\mathbf{x}$$

MXNet vai criar o grafo correspondente.

Backward: calcular gradiente de y em relação a cada componente de x

Conferindo...

Dado $y = 2\mathbf{x}^{\top}\mathbf{x}$, sabemos

$$\frac{\partial y}{\partial \mathbf x} = 4\mathbf{x}$$

Referências para estudo

Capítulos 1 e 2 de Dive into Deep Learning